package ar.edu.unrn.lia.model;

// Generated Nov 18, 2009 7:42:34 PM by Hibernate Tools 3.2.2.GA

import java.util.Date;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;
import javax.validation.constraints.NotNull;

import org.springframework.beans.factory.annotation.Autowired;

@Entity
@Table(name = "movimiento")
public class Movimiento extends BaseEntity implements java.io.Serializable {

	/**
	 * 
	 */
	private static final long serialVersionUID = 7464260655839027873L;

	private TipoMovimiento tipoMovimiento = TipoMovimiento.INGRESO;
	private Date fecha = new Date();
	private String concepto;
	private Double importe = 0.0;
	private Double debe;
	private Double haber;
	private Cuenta cuenta;
	private Integer asiento;
	private String factura;
	private Double saldo;

	private TipoFactura tipoFactura = TipoFactura.FACTURA_B;

	public Movimiento() {
	}

	public Movimiento(TipoMovimiento tipoMovimiento, Date fecha,
			String concepto, Double importe, Double debe, Double haber) {
		this.tipoMovimiento = tipoMovimiento;
		this.fecha = fecha;
		this.concepto = concepto;
		this.importe = importe;
		this.debe = debe;
		this.haber = haber;
	}
	
	public Movimiento(TipoMovimiento tipoMovimiento, Date fecha,
			String concepto, Double importe, Integer asiento) {
		this.tipoMovimiento = tipoMovimiento;
		this.fecha = fecha;
		this.concepto = concepto;
		this.importe = importe;		
		this.asiento = asiento;
		setearSegunTipo();
	}
	
	

	//TODO Revisar estaba invertido 
	//TODO Para que estaba el @Autowired
	public void setearSegunTipo() {		
			if (this.tipoMovimiento != null) {
				if (TipoMovimiento.EGRESO.equals(this.getTipoMovimiento())) {
					this.debe = this.importe;
					this.haber = 0.0;
				} else if (TipoMovimiento.INGRESO.equals(this.getTipoMovimiento())) {
					this.haber = this.importe;
					this.debe = 0.0;
				}
				
			}		
	}	
	
	
	public enum TipoFactura {
		FACTURA_A("A"), FACTURA_B("B"), FACTURA_C("C"), FACTURA_F("F"), TIKET(
				"Tiket");

		private String tipo;

		private TipoFactura(String tipo) {
			this.tipo = tipo;
		}

		@Override
		public String toString() {
			return tipo;
		}
	}

	public enum TipoMovimiento {
		INGRESO("INGRESO"), EGRESO("EGRESO");

		private String dsc;

		private TipoMovimiento(String dsc) {
			this.dsc = dsc;
		}

		@Override
		public String toString() {
			return dsc;
		}
	}

	@NotNull(message = "{name.notnull}")
	@Enumerated(EnumType.STRING)
	public TipoFactura getTipoFactura() {
		return tipoFactura;
	}

	/**
	 * @param tipoFactura
	 *            the tipoFactura to set
	 */
	public void setTipoFactura(TipoFactura tipoFactura) {
		this.tipoFactura = tipoFactura;
	}

	/**
	 * @return the factura
	 */
	@Column(name = "factura", length = 40)
	public String getFactura() {
		return factura;
	}

	/**
	 * @param factura
	 *            the factura to set
	 */
	public void setFactura(String factura) {
		this.factura = factura;
	}

	
	/**
	 * @return the cuenta
	 */
	@NotNull(message = "{name.notnull}")
	@ManyToOne(fetch = FetchType.LAZY)
	@JoinColumn(name = "cuenta_id", referencedColumnName = "id")
	public Cuenta getCuenta() {
		return cuenta;
	}

	/**
	 * @param cuenta
	 *            the cuenta to set
	 */
	public void setCuenta(Cuenta cuenta) {
		this.cuenta = cuenta;
	}

	@Enumerated(EnumType.STRING)
	@NotNull(message = "{name.notnull}")
	public TipoMovimiento getTipoMovimiento() {
		return this.tipoMovimiento;
	}

	public void setTipoMovimiento(TipoMovimiento tipoMovimiento) {
		this.tipoMovimiento = tipoMovimiento;

	}

	@Temporal(TemporalType.TIMESTAMP)
	@Column(name = "fecha", length = 0)
	@NotNull(message = "{name.notnull}")
	public Date getFecha() {
		return this.fecha;
	}

	public void setFecha(Date fecha) {
		this.fecha = fecha;
	}

	@Column(name = "concepto", length = 250)
	@NotNull(message = "{name.notnull}")
	public String getConcepto() {
		return this.concepto;
	}

	public void setConcepto(String concepto) {
		this.concepto = concepto;
	}

	@Column(name = "importe", precision = 15, scale = 3)
	@NotNull(message = "{name.notnull}")
	public Double getImporte() {
		return this.importe;
	}

	public void setImporte(Double importe) {
		this.importe = importe;
	}

	@Column(name = "debe", precision = 15, scale = 3)
	public Double getDebe() {
		return this.debe;
	}

	public void setDebe(Double debe) {
		this.debe = debe;
	}

	@Column(name = "haber", precision = 15, scale = 3)
	public Double getHaber() {
		return this.haber;
	}

	public void setHaber(Double haber) {
		this.haber = haber;
	}

	
	/**
	 * @return the asiento
	 */
	@Column(name = "asiento")
	public Integer getAsiento() {
		return asiento;
	}

	/**
	 * @param asiento
	 *            the asiento to set
	 */
	public void setAsiento(Integer asiento) {
		this.asiento = asiento;
	}

	public Double getSaldo() {
		return saldo;
	}

	public void setSaldo(Double saldo) {
		this.saldo = saldo;
	}
	
	

}
